package com.zjl.redis.第02章_十大数据类型;

import com.zjl.redis.第01章_redis安装.RedisUtil;
import org.junit.Test;
import redis.clients.jedis.Jedis;

/**
 * HyperLogLog是用来做基数统计的算法，HyperLogLog 的优点是，
 * 在输入元素的数量或者体积非常非常大时，计算基数所需的空间总是固定且是很小的。
 *
 * 在Redis里面，每个HyperLogLog键只需要花费12 KB内存，就可以计算接近2^64个不同元素的基数。
 * 这和计算基数时，元素越多耗费内存就越多的集合形成鲜明对比。
 *
 * 但是，因为HyperLogLog只会根据输入元素来计算基数，而不会储存输入元素本身，
 * 所以HyperLogLog不能像集合那样，返回输入的各个元素。
 *
 * 比如:每天计算某个首页有多少用户访问
 */
public class B7_HyperLogLog {
    /**
     * HyperLogLog//主要解决基数问题  会自动去重  底层是string
     *
     * 基数估计就是在误差可接受的范围内, 快速计算基数。 误差在 0.81%
     * ①Redis HyperLogLog 是用来做基数统计的算法, HyperLogLog的优点是,
     *  在输入元素的数量或者体积非常非常大时,
     *  计算基数所需的空间总是固定的、并且是很小的。
     * ②在Redis里面,每个HyperLogLog键只需要花费12 KB内存，就可以计算接近2^64个不同元素的基数。
     *  这和计算基数时，元素越多耗费内存就越多的集合形成鲜明对比。
     * ③但是,因为HyperLogLog只会根据输入元素来计算基数,而不会储存输入元素本身,
     *  所以HyperLogLog不能像集合那样,返回输入的各个元素。
     *
     *  pfadd key value1 value2//添加
     *  pfcount key//返回key有几个值
     *  pfmerge destkey key1 key2//将key1和key2求和（合并）   新的放到destkey里
     *
     *  @see com.zjl.redis.第14章_大数据统计.A2_HyperLogLog的源码分析
     *
     */
    @Test
    public void 误差计算(){
        System.out.println(1.04/Math.sqrt(16384));//0.008125
    }
    public static void main(String[] args) {

        Jedis jedis = RedisUtil.getRedis();
        System.currentTimeMillis();//获取当前时间戳
        System.out.println(jedis.ping());//查看是否连接成功  PONG:成功
        jedis.del("hll");
        for (int i = 0;i<100;i++){
            jedis.pfadd("hll",i+"");
        }
        System.out.println(jedis.pfcount("hll"));
        jedis.close();
    }
}
